﻿// See https://aka.ms/new-console-template for more information
using AESEncrypt;
using Bing.Encryption;
using Newtonsoft.Json;
using System.Security.Cryptography;
using System.Text;



Console.WriteLine(DateTime.UtcNow);
Console.WriteLine(DateTime.Now);

Console.WriteLine(Guid.NewGuid().ToString("n"));

var s256 = "hello";

Console.WriteLine(Md5Provider.MD5Encrypt16(s256) ); 
Console.WriteLine(Md5Provider.MD5Encrypt32(s256) ); 
Console.WriteLine(Md5Provider.MD5Encrypt64(s256) ); 

//Aes.Create().EncryptEcb
var x = sha.sha256(s256);
var y = sha.SHA256g(s256);
Console.WriteLine(x == y);


var key = AESEncryptionProvider.CreateKey(AESKeySizeType.L128);
string skey = JsonConvert.SerializeObject(key);
Console.WriteLine(skey);

var s1 = AESEncryptionProvider.Encrypt("仙剑蜀山", key.Key, key.IV, keySize: key.Size);


var jkey = JsonConvert.DeserializeObject<AESKey>(skey);
var o1 = AESEncryptionProvider.Decrypt(s1, jkey.Key, jkey.IV, keySize: key.Size);

Console.WriteLine(o1);

Console.ReadLine();

Console.WriteLine("Hello, World!");

var k = AESCryptoTextProvider.CreateKey();

var mw = AESCryptoTextProvider.Encrypt(k.Key, k.IV, "123");

var data = AESCryptoTextProvider.Decrypt(k.Key, k.IV, mw);

Console.WriteLine(data);



string original = "Here is some data to encrypt!";

// Create a new instance of the Aes
// class.  This generates a new key and initialization
// vector (IV).
using (Aes myAes = Aes.Create())
{

    // Encrypt the string to an array of bytes.
    byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);

    // Decrypt the bytes to a string.
    string roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);

    //Display the original data and the decrypted data.
    Console.WriteLine("Original:   {0}", original);
    Console.WriteLine("Round Trip: {0}", roundtrip);
}

static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
{
    // Check arguments.
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");
    if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
    if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("IV");
    byte[] encrypted;

    // Create an Aes object
    // with the specified key and IV.
    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Key = Key;
        aesAlg.IV = IV;

        // Create an encryptor to perform the stream transform.
        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

        // Create the streams used for encryption.
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    //Write all data to the stream.
                    swEncrypt.Write(plainText);
                }
                encrypted = msEncrypt.ToArray();
            }
        }
    }

    // Return the encrypted bytes from the memory stream.
    return encrypted;
}

static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
{
    // Check arguments.
    if (cipherText == null || cipherText.Length <= 0)
        throw new ArgumentNullException("cipherText");
    if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
    if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("IV");

    // Declare the string used to hold
    // the decrypted text.
    string plaintext = null;

    // Create an Aes object
    // with the specified key and IV.
    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Key = Key;
        aesAlg.IV = IV;

        // Create a decryptor to perform the stream transform.
        ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

        // Create the streams used for decryption.
        using (MemoryStream msDecrypt = new MemoryStream(cipherText))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                {

                    // Read the decrypted bytes from the decrypting stream
                    // and place them in a string.
                    plaintext = srDecrypt.ReadToEnd();
                }
            }
        }
    }

    return plaintext;
}


Console.ReadKey();